1 module hip.api.renderer.shader;
2 public import hip.api.renderer.operations;
3 public import hip.api.renderer.texture;
4 public import hip.api.renderer.shadervar;
5 
6 enum ShaderStatus : ubyte
7 {
8     SUCCESS,
9     VERTEX_COMPILATION_ERROR,
10     FRAGMENT_COMPILATION_ERROR,
11     LINK_ERROR,
12     UNKNOWN_ERROR
13 }
14 
15 enum ShaderTypes : ubyte
16 {
17     vertex,
18     fragment,
19     geometry, //Unsupported yet
20     none
21 }
22 
23 enum HipShaderPresets : ubyte
24 {
25     DEFAULT,
26     FRAME_BUFFER,
27     GEOMETRY_BATCH,
28     SPRITE_BATCH,
29     BITMAP_TEXT,
30     NONE
31 }
32 
33 /** 
34  * This interface is currrently a Shader factory.
35  */
36 interface IShader
37 {
38     VertexShader createVertexShader();
39     FragmentShader createFragmentShader();
40     ShaderProgram createShaderProgram();
41 
42     bool compileShader(FragmentShader fs, string shaderSource);
43     bool compileShader(VertexShader vs, string shaderSource);
44     bool linkProgram(ref ShaderProgram program, VertexShader vs,  FragmentShader fs);
45 
46     void setBlending(ShaderProgram prog, HipBlendFunction src, HipBlendFunction dst, HipBlendEquation eq);
47     void bind(ShaderProgram program);
48     void unbind(ShaderProgram program);
49     void sendVertexAttribute(uint layoutIndex, int valueAmount, uint dataType, bool normalize, uint stride, int offset);
50     int  getId(ref ShaderProgram prog, string name);
51     
52 
53     ///Used as intermediary for deleting non program intermediary in opengl
54     void deleteShader(FragmentShader* fs);
55     ///Used as intermediary for deleting non program intermediary in opengl
56     void deleteShader(VertexShader* vs);
57 
58     void createVariablesBlock(ref ShaderVariablesLayout layout, ShaderProgram shaderProgram);
59     bool setShaderVar(ShaderVar* sv, ShaderProgram prog, void* value);
60     void sendVars(ref ShaderProgram prog, ShaderVariablesLayout[string] layouts);
61 
62     /** 
63      * Each graphics API has its own way to bind array of textures, thus, this version was required.
64      */
65     void bindArrayOfTextures(ref ShaderProgram prog, IHipTexture[] textures, string varName);
66     void dispose(ref ShaderProgram);
67 
68     void onRenderFrameEnd(ShaderProgram program);
69 }
70 
71 abstract class VertexShader
72 {
73 }
74 abstract class FragmentShader
75 {
76 }
77 
78 abstract class ShaderProgram
79 {
80     string name;
81 }